package com.wm.wmim.common.utils;

import com.wm.wmim.common.constant.RpcCommonConstant;
import com.wm.wmim.common.dto.RpcRespDTO;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

/**
 * @author weiming
 * @date 2024/9/1 22:49
 * @description
 */
public class RpcRespUtils {

    /**
     * 判断是否成功的 RPC 响应结果
     * @param rpcRespDTO
     * @return
     */
    public static boolean isSuccess(RpcRespDTO rpcRespDTO) {
        return !isFail(rpcRespDTO);
    }

    /**
     * 判断是否成功的 RPC 响应状态码
     * @param code
     * @return
     */
    public static boolean isSuccessCode(String code) {
        return RpcCommonConstant.CODE_SUCCESS.equals(code);
    }

    /**
     * 判断是否失败的 RPC 响应结果
     * @param rpcRespDTO
     * @return
     */
    public static boolean isFail(RpcRespDTO rpcRespDTO) {
        if (rpcRespDTO == null  || rpcRespDTO.getCode() == null) {
            return true;
        }
        return !RpcCommonConstant.CODE_SUCCESS.equals(rpcRespDTO.getCode());
    }

    /**
     * 构建 RPC 响应结果
     * @param code
     * @param <T>
     * @return
     */
    public static <T> RpcRespDTO<T> buildResp(String code) {
        return new RpcRespDTO<T>(code);
    }

    /**
     * 构建 RPC 响应结果
     * @param code
     * @param <T>
     * @return
     */
    public static <T> RpcRespDTO<T> buildResp(String code, String msg) {
        return new RpcRespDTO<T>(code, msg);
    }

    /**
     * 构建 RPC 响应结果
     * @param code
     * @param <T>
     * @return
     */
    public static <T> RpcRespDTO<T> buildResp(String code, String msg, String detail, T data) {
        return new RpcRespDTO<T>(code, msg, detail, data);
    }

    /**
     * 构建 RPC 响应结果
     * @param code
     * @param <T>
     * @return
     */
    public static <T> RpcRespDTO<T> buildResp(String code, String msg, String detail, T data, Integer httpStatus) {
        return new RpcRespDTO<T>(code, msg, detail, data, httpStatus);
    }

    /**
     * 构建 RPC 响应结果
     * @param code
     * @param <T>
     * @return
     */
    public static <T> RpcRespDTO<T> buildResp(String code, String msg, T data) {
        return new RpcRespDTO<T>(code, msg, data);
    }

    /**
     * 使用 data 构建 RPC 成功响应结果
     * @param data
     * @param <T>
     * @return
     */
    public static <T> RpcRespDTO<T> buildSuccessResp(T data) {
        return new RpcRespDTO().buildSuccessResp(data);
    }

    /**
     * 使用 data 构建 RPC 失败响应结果
     * @param data
     * @param <T>
     * @return
     */
    public static <T> RpcRespDTO<T> buildFailResp(T data) {
        return new RpcRespDTO().buildFailedResp(data);
    }

    /**
     * 构建参数验证失败的 RPC 响应结果
     * @param reasons 失败原因
     * @param <T>
     * @return
     */
    public static <T> RpcRespDTO<T> buildErrorParamResp(String... reasons) {
        RpcRespDTO<T> rpcRespDTO = new RpcRespDTO(RpcCommonConstant.CODE_ERR_PARAM, RpcCommonConstant.MSG_ERR_PARAM);
        if (ArrayUtils.isNotEmpty(reasons)) {
            rpcRespDTO.setMsg(StringUtils.join(reasons, ','));
        }
        return rpcRespDTO;
    }

    public static <T> T getData(RpcRespDTO<T> rpcRespDTO) {
        if (isSuccess(rpcRespDTO)){
            return rpcRespDTO.getData();
        }
        throw new RuntimeException("调用RPC异常!");
    }

}
